#ifndef _NORMALIZATION_LOCALS_H
#define _NORMALIZATION_LOCALS_H

#include "../model/datatypes.h"
#include "normalized_datatypes.h"

// number of generated existential restrictions for normalization stats
extern int generated_exists_restriction_count;
extern int generated_subclass_axiom_count;
extern int singleton_premise_count;
// max lhs and rhs sizes for normalization stats
extern int max_lhs_size;
extern int max_rhs_size;
extern int cum_lhs_size;
extern int cum_rhs_size;
extern int generated_subrole_axiom_count;

// judy array for storing normalized conjunctions
extern Pvoid_t normalized_conjunctions;

// judy arrays for storing generated atomic concepts
extern Pvoid_t generated_atomic_concepts_right;
extern Pvoid_t generated_atomic_concepts_left;

extern int generated_atomic_concepts_left_count;
extern int generated_atomic_concepts_right_count;


void put_generated_atomic_concept(NormalizedConcept* generated_atomic_concept, NormalizedConcept* normalized_filler, enum axiom_side side);

NormalizedConcept* get_generated_atomic_concept(NormalizedConcept* normalized_filler, enum axiom_side side);

// NormalizedConcept* get_normalized_atomic_concept(char* name, enum axiom_side side);
NormalizedConcept* get_create_normalized_atomic_concept(Concept* c);

void put_normalized_conjunction(NormalizedConcept* conjunction);
NormalizedConcept* get_normalized_conjunction(NormalizedConcept** conjuncts, int size);

NormalizedConcept* get_normalized_conjunction(NormalizedConcept** conjuncts, int size);

NormalizedConcept* get_create_normalized_conjunction(NormalizedConcept** conjuncts, int size);

NormalizedRole* get_create_normalized_atomic_role(Role* r);

NormalizedConcept* create_new_normalized_atomic_concept(enum axiom_side side);

void add_normalized_axiom(NormalizedAxiom* ax, NormalizedTBox* n_tbox);

NormalizedAxiom* create_normalized_subclass_axiom(NormalizedConcept* lhs, NormalizedConcept* rhs);

NormalizedAxiom* create_normalized_subrole_axiom(NormalizedRole* lhs, NormalizedRole* rhs);

#endif
